package com.edu.videosurveillance;

import com.edu.videosurveillance.bean.PAlarmLinkageInfo;
import com.edu.videosurveillance.bean.TFileStreamCondtion;
import com.edu.videosurveillance.bean.TSearchCondition;
import com.edu.videosurveillance.bean.UserContext;
import com.edu.videosurveillance.bean.UserInfo;

/**
 * 类描述:Jni转换帮助类
 * Created by 张小兵 on 2016/11/25.
 */

public class JniHelper {
    /**
     * 创建一个客户端实例,优先于其它所有方法执行
     */
    public static native void createInstance();

    /**
     * 销毁实例,释放资源
     */
    public static native void destoryInstance();

    /**
     * 发送心跳数据包
     *
     * @param mContext 根据DEMO来看,这个地方传NULL
     */
    public static native void setHeartbeatEvent(UserContext mContext);

    /**
     * 设置报警回调函数
     * 【参数】lInfoFormat：回调的报警内容格式类型
     * IF_CLIENT_ALARMINFO = 0; 		 //用于推送客户端报警详细信息
     * IF_MCP_ALARMINFO    = 1;    	// 用于推送级联服务报警详细信息
     *
     * @param lInfoFormat
     * @param mContext
     */
    public static native void setAlarmEvent(long lInfoFormat, UserContext mContext);

    /**
     * 设置资源更新回调
     * 【参数】lMsgFormat：资源更新内容类型
     * MT_CLIENT_TREE      = 0;     //用于客户端，获取生成位置、编码设备、解码器、报警主机、视频点位树的XML
     * MT_MCP_SOURCE       = 1;      //用于获取级联服务，获取位置、编码设备、通道（视频、输入、输出）详细信息的XML
     *
     * @param lMsgFormat
     * @param mContext
     */
    public static native void setSourceUpDataEvent(long lMsgFormat, UserContext mContext);

    /**
     * 【功能】用于登录平台，要做其他操作必须先登录平台，是同步函数，当且仅当登录成功后才可以进行其他操作
     * 【返回值】用户登录平台的会话句柄(大于等于0)或者错误代码（小于0）
     *
     * @param ip        数据IP;
     * @param port      数据库端口，默认10080;
     * @param account   用户帐号
     * @param password  用户密码
     * @param md5       是否使用Md5加密，如果参数password已经使用Md5加密那么IsMd5为false，否则为True;
     * @param mUserInfo 登录信息，由应用层传入用于保存登录信息;
     */
    public static native long login(String ip, long port, String account, String password, boolean md5, UserInfo mUserInfo);

    /**
     * 【功能】用于登录平台，要做其他操作必须先登录平台，是异步函数，当且仅当登录成功后才可以进行其他操作,登录结果通过{@link JniHelper#pLogonCallBack}获取
     * 【返回值】用户登录平台的会话句柄(大于等于0)或者错误代码（小于0）
     *
     * @param ip       数据IP;
     * @param port     数据库端口，默认10080;
     * @param account  用户帐号
     * @param password 用户密码
     * @param md5      是否使用Md5加密，如果参数password已经使用Md5加密那么IsMd5为false，否则为True;
     * @param mContext
     */
    public static native long loginAsync(String ip, long port, String account, String password, boolean md5, UserContext mContext);

    /**
     * 退出登录
     *
     * @param lUserId
     * @return
     */
    public static native long logout(long lUserId);

    /**
     * 布防，即接收平台报警
     *
     * @param lUserId
     * @return
     */
    public static native long SetArming(long lUserId);

    /**
     * 撤防，即停止接收平台报警
     *
     * @param lUserId
     * @return
     */
    public static native long SetUnArming(long lUserId);

    /**
     * 设置获取资源回调函数
     *
     * @param lUserId  用户登录平台返回的会话句柄
     * @param mContext
     * @return
     */
    public static native long setGetSourceCallBack(long lUserId, UserContext mContext);

    /**
     * 获取资源（位置/设备/通道），资源XML格式字符串，由回调函数<SnClient_SetGetSourceCallBack>中回调
     *
     * @param lUserId     用户登录平台返回的会话句柄
     * @param lSourceType //生成位置、编码设备、解码器、报警主机、视频点位树的XML
     *                    ST_PositionTree = 0;     //位置树
     *                    ST_CodeDeviceTree = 1;  //编码设备
     *                    ST_MatrixTree = 2;      //解码器
     *                    ST_AlarmDeviceTree = 3; //报警主机树
     *                    ST_Channeltree = 4;     //视频点位树
     *                    位置、编码设备、通道（视频、输入、输出）详细信息的XML
     *                    ST_DetailedPositionTree = 5; //位置详细信息
     *                    ST_CodeDetailedDeviceTree = 6; //编码设备详细信息
     *                    ST_DetailedChanneltree = 7; // 通道详细信息（视频、输入、输出）
     * @return
     */
    public static native long getSource(long lUserId, long lSourceType);

    /**
     * 获取检索条件下的报警总数
     *
     * @param lUserId
     * @param stSearchCondition 检索条件结构体
     * @return 错误码或者报警总数
     */
    public static native long getAlarmCount(long lUserId, TSearchCondition stSearchCondition);

    /**
     * 获取检索条件下的报警XML格式的报警详情,返回结果在{@link JniHelper#pGetAlarmPro}中获取
     *
     * @param lUserId
     * @param stSearchCondition 检索条件结构体
     * @param lStartline        分页获取的开始记录号
     * @param lEndLine          分页获取的开始记录结尾号
     * @param mContext
     * @return
     */
    public static native long getAlarmList(long lUserId, TSearchCondition stSearchCondition, long lStartline, long lEndLine, UserContext mContext);

    /**
     * 获取报警联动详细信息
     * @param lUserId
     * @param sAlarmId 平台报警ID
     * @param pstAlarmLinkageInfo 报警结构体指针,由应用层传入用于保存报警联动详细信息
     * @return
     */
    public static native long getAlarmLinkageInfo(long lUserId, String sAlarmId, PAlarmLinkageInfo pstAlarmLinkageInfo);

    /**
     * 报警处理
     * @param lUserId
     * @param sAlarnID 报警ID
     * @param lHandelType 接警处理类型；0=一般接警、1=挂起接警、2=转发接警
     * @param aParma 参数内容指针；接警-接警内容；转发-用户ID
     * @param lParamLen 参数内容长度
     * @return
     */
    public static native long handleAlarm(long lUserId, String sAlarnID,long lHandelType,String aParma, long lParamLen);

    /**
     * 批量处理分离报警
     * @param lUserId
     * @param aAlarmIDs 需要批量处理的报警ID列表字符串指针，每个ID以”,”分割
     * @param lAlarmIDsLen 需要批量处理的报警ID列表字符串长度
     * @param aParam 参数内容指针；接警-接警内容；
     * @param lParamLen 参数内容长度
     * @return 错误代码
     */
    public static native long batchHandleAlarm(long lUserId, String aAlarmIDs, long lAlarmIDsLen, String aParam, long lParamLen);

    /**
     *  批量处理合并报警;
     * @param lUserId
     * @param lListType 报警处理状态类型；0=实时、1=挂起、2=转发
     * @param pDevIDs 需要批量处理的设备ID列表字符串指针，每个ID以”,”分割
     * @param lDevIDsLen
     * @param pAlarmTypeIDs 需要批量处理的报警类型ID列表字符串指针，每个ID以”,”分割
     * @param lAlarmTypeIDsLen
     * @param aParam 参数内容指针；接警-接警内容；
     * @param lParamLen
     * @return
     */
    public static native long batchHandleGroupAlarm(long lUserId, long lListType, String pDevIDs, long lDevIDsLen, String pAlarmTypeIDs, long lAlarmTypeIDsLen, String aParam, long lParamLen);
    /**
     * 获取通道视频流，信息由{@link JniHelper#pfnGetStreamInfoCallBack}函数中回调，视频流由{@link JniHelper#pfnExportStreamCallBack}中回调
     *
     * @param lUserId
     * @param sChannelId  视频通道ID
     * @param lStreamType 码流格式；0=子码流 1=主码流
     * @param mContext
     * @return >= 0为文件列表句柄；<0为错误代码
     */
    public static native long getStream_Start(long lUserId, String sChannelId, long lStreamType, UserContext mContext);

    /**
     * 登出预览模块，中断通道视频流
     * @param lStreamId 预览会话句柄
     * @return
     */
    public static native long getStream_Stop(long lStreamId);

    /**
     * 获取前端图片文件个数
     * @param lUserID
     * @param sChannelID 通道ID
     * @param lFileType 图片类型，详见REMOTE_PIC_TYPE描述
     * @param sStartTime 开始时间
     * @param sEndTime 结束时间
     * @param lFileCount 图片文件个数(该值是返回的文件个数)
     * @return 图片列表句柄
     */
    public static native long getPictureFileListCount(long lUserID, String sChannelID, long lFileType,String sStartTime, String sEndTime, long lFileCount);

    /**
     * 获取前端图片文件列表
     * @param lFileListId {@link JniHelper#getPictureFileListCount}的返回值
     * @param pPictureList 图片列表数组
     * @return 错误代码
     */
    public static native long getPictureFileList( long lFileListId,String[] pPictureList);

    /**
     * 前端图片下载到服务器
     * @param lUserID
     * @param sChannelID 通道ID
     * @param sPicFileName 通道ID
     * @return
     */
    public static native long pictureDownload(long lUserID, String sChannelID, String sPicFileName);
    /**
     * 心调回调函数,jni层通过反射获取其中的方法,调用回来
     *
     * @param userId
     * @param lState
     * @param lErrCode
     * @param context
     */
    public static void pOnHeartbeatEvent(long userId, long lState, long lErrCode, UserContext context) {

    }

    /**
     * 报警回调函数,用于捕获报警
     *
     * @param userId
     * @param lInfoType    报警内容格式
     * @param aInfoData    报警内容数据
     * @param lInfoDataLen 报警内容数据长度
     * @param mContext
     */
    public static void pAlarmMessageEvent(long userId, long lInfoType, String aInfoData, long lInfoDataLen, UserContext mContext) {

    }

    /**
     * 资源更新回调,用于接收和处理资源更新
     *
     * @param userId
     * @param lSourceType
     * @param aUpData
     * @param lUpDataLen
     * @param mContext
     */
    public static void pUpDataEvent(long userId, long lSourceType, String aUpData, long lUpDataLen, UserContext mContext) {

    }

    /**
     * 平台异步登录回调
     *
     * @param lUserId      用户登录平台返回的会话句柄
     * @param lResultCode  成功(等于0)或者错误代码（小于0）
     * @param pstLogOnInfo 登录信息
     * @param aUserContext
     */
    public static void pLogonCallBack(long lUserId, long lResultCode, UserInfo pstLogOnInfo, UserContext aUserContext) {

    }

    /**
     * 资源获取回调,用获取获取资源
     *
     * @param lUserId      //用户登录平台返回的会话句柄
     * @param lSourceType  //参数类型
     * @param lErrCode     //错误代码
     * @param aParaIn      //资源内容指针
     * @param lParaInLen   //资源内容大小
     * @param aUserContext //上下文指针
     */
    public static void pGetTredPro(long lUserId, long lSourceType, long lErrCode, String aParaIn, long lParaInLen, UserContext aUserContext) {

    }

    /**
     * 报警列表返回结果
     *
     * @param lUserId
     * @param lParamType   参数类型（0=未合并类型 1=合并后类型）
     * @param lErrCode
     * @param aParaIn
     * @param lParaInLen
     * @param aUserContext
     */
    public static void pGetAlarmPro(long lUserId, long lParamType, long lErrCode, String aParaIn, long lParaInLen, UserContext aUserContext) {

    }

    public static void pfnGetStreamInfoCallBack() {

    }

    public static void pfnExportStreamCallBack() {

    }
}
